// 浅拷贝 ： 把对象拷贝给一个新的对象 (不拷贝地址)   只拷贝一层

const obj = {
    name:'zxc'
}

// 这不是拷贝 而是直接将 obj 的地址值赋给  newObj 变量  （数组同理）
const newObj = obj

//  所以修改n ewObj 中的属性，相当于修改了 obj 中的属性
newObj.name = 'cxz'

console.log(obj) // { name: 'cxz' }
console.log(newObj) // { name: 'cxz' }


/**
 * 对象的浅拷贝
 * 1.Object.assign()
 * const newObj = Object.assign({},obj)
 * 2.展开运算符
 * const newObj = {...obj}
 */
const newObj2 = Object.assign({},obj)
newObj2.name = '邹希晨'
console.log(newObj2 )

const newObj3 = {...obj}
newObj3.name = '邹晨曦'
console.log(newObj3)

/**
 * 数组的浅拷贝
 * 1.concat
 * const newArr = [].concat(arr)
 * 2.展开运算符
 * const newArr2 = [...arr]
 */
const arr = ['符玄','青雀']
console.log(arr) //  [ '符玄', '青雀' ]

const newArr = [].concat(arr)
newArr[1] = '甘雨'
console.log(newArr) // [ '符玄', '甘雨' ]

const newArr2 = [...arr]
newArr2[1] = '刻晴'
console.log(newArr2) // [ '符玄', '刻晴' ]

// 浅拷贝注意： 如果拷贝的对象里面存在 引用类型的数据  还是会拷贝到引用数据类型的地址
const student = {
    name:'zxc',
    falimy:{
        father:'zhl'
    }
}
const student2 = {...student}
student2.falimy.father = 'hjy'
console.log(student) // { name: 'zxc', falimy: { father: 'hjy' } }
console.log(student2) // { name: 'zxc', falimy: { father: 'hjy' } }




// 深拷贝  ： 拷贝多层，不再拷贝地址

/**
 * 1. JSON 的 序列化  和 反序列化
 * 序列化 : JSON.stringify()    将对象转成字符串
 * 反序列化 ：JSON.parse()  将字符串转成对象
 */

const preson = {
    name:'原神',
    family:{
        father:'米哈游'
    },
    type:['3D','剧情','端游手游'],
    lover:undefined,
    fn:function(){
        return 123
    }
}

const newPerson = JSON.parse(JSON.stringify(preson))

console.log(preson === newPerson) // false
console.log(preson.family === newPerson.falimy) // false


// 注意 ：使用 JSON.stringify 和  JSON.parse 进行深拷贝，无法拷贝 undefined 和 function

console.log(preson.lover)  // undefined

// 原因：  因为 在使用 JSON.stringify  时  无法将 函数和 undefined 的值  转换成字符串 ，  所以  无法拷贝 undefined 和 function
console.log(JSON.stringify(preson)) //   {"name":"原神","family":{"father":"米哈游"},"type":["3D","剧情","端游手游"]}

console.log(newPerson.lover) // undefined

console.log(preson.fn()) // 123
// console.log(newPerson.fn()) // 报错